package com.executor;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName ScheduledThreadPoolExecutorStudy
 * @Description 定时任务线程池
 * @Author csh
 * @Date 2023/4/7 9:52
 */
public class ScheduledThreadPoolExecutorStudy {


    public static void main(String[] args) {
        //corePoolSize指线程
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
        //延迟一秒执行
        for (int i = 0; i < 10; i++) {
            executor.schedule(new Task(i,"任务1："),1, TimeUnit.SECONDS);
        }
        //周期性执行 每隔3秒（period）  延迟0秒(initialDelay)   定时任务
        //period 用于间隔执行任务，
        //1.执行时间小于period：执行完后再隔period时间再执行下一批;
        //2.执行时间大于period：执行完后不会再隔period时间,而是直接执行。
        for (int i = 0; i < 10; i++) {
            executor.scheduleAtFixedRate(new Task(i,"任务2："),0,3,TimeUnit.SECONDS);
        }
        //周期性执行 每隔15秒（delay）  延迟0秒(initialDelay)
        //initialDelay 首次启动延迟多久后执行
        //delay 下次任务执行前的延迟时间
        for (int i = 0; i < 10; i++) {
            executor.scheduleWithFixedDelay(new Task(i,"任务3："),3,1,TimeUnit.SECONDS);
        }
    }

    static class Task implements Runnable {
        private int taskId;
        private String taskName="默认！";
        public Task(int taskId) {
            this.taskId = taskId;
        }

        public Task(int taskId, String taskName) {
            this.taskId = taskId;
            this.taskName = taskName;
        }

        @Override
        public void run() {
            System.out.println(taskName + taskId + "开始执行，当前线程名为" + Thread.currentThread().getName());
            try {
                // 模拟任务执行的耗时
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(taskName + taskId + "执行完毕，当前线程名为" + Thread.currentThread().getName());
        }
    }
}
